package Silnik;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Klasa "zarządzająca" zapytaniami o kursy walut.
 *
 * @author Jakub Banaszewski
 */
public class Kursy
{

   private static final HashMap<String, String> skrótKraj = new HashMap<>();
   private static final String URLstring = "http://www.nbp.pl/kursy/xml/dir.txt";
   private static final HashMap<MyDate, String> adresKursu = new HashMap<>();
   private static final ArrayList<MyDate> dostepneDaty = new ArrayList();
   private static final HashMap<MyDate, KursDnia> kursy = new HashMap<>();
   private static final int memoryLimit = 10000;

   //<editor-fold defaultstate="collapsed" desc="Pobieranie adresu kursów">
   static
   {
      Calendar cal = Calendar.getInstance();
      URL dir = null;
      try
      {
         dir = new URL(URLstring);
      } catch (MalformedURLException ex)
      {
         Logger.getLogger(Kursy.class.getName()).log(Level.SEVERE, null, ex);
      }
      if (dir != null)
         try (BufferedReader in = new BufferedReader(new InputStreamReader(dir.openStream())))
         {

            String inputLine;
            while ((inputLine = in.readLine()) != null)
            {
               String s = inputLine.trim();
               if (!s.startsWith("a"))
                  continue;
               s = s.split("z")[1];
               int year = Integer.parseInt("20" + s.substring(0, 2));
               int month = Integer.parseInt(s.substring(2, 4));
               int day = Integer.parseInt(s.substring(4, 6));
               cal.set(year, month-1, day, 12, 0, 0);
               String address = "http://www.nbp.pl/kursy/xml/" + inputLine.trim() + ".xml";
               if (skrótKraj.isEmpty())
               {
                  KursDnia odczyt = new KursDnia(address);
                  skrótKraj.putAll(odczyt.getSkróty());
               }
               adresKursu.put(new MyDate(cal.getTime()), address);
               dostepneDaty.add(new MyDate(cal.getTime()));
            }
         } catch (Exception ex)
         {
            Logger.getLogger(Kursy.class.getName()).log(Level.SEVERE, null, ex);
         }
      Collections.sort(dostepneDaty);
   }
   //</editor-fold>
/*
   public static Date dateNorma(Date data)
   {
      Calendar cal = Calendar.getInstance();
      cal.setTime(data);
      int year = cal.get(Calendar.YEAR);
      int mount = cal.get(Calendar.MONTH);
      int day = cal.get(Calendar.DATE);
      cal.set(year, mount, day, 12, 0, 0);
      return cal.getTime();
   }
*/
   /**
    * Metoda zwracająca kurs waluty w zadanym terminie
    *
    * @param termin Dzień, z której jest pobierany kurs
    * @param waluta Nazwa waluty
    * @return
    */
   public static Double getKurs(MyDate termin, String waluta) throws Exception
   {
      if (!kursy.containsKey(termin))
      {
         if (kursy.size() >= memoryLimit)
            kursy.clear(); //TODO usuwanie połowy na przykład
         kursy.put(termin, new KursDnia(adresKursu.get(termin)));
      }
      return kursy.get(termin).getValue(waluta);
   }

   public static int getPrzelicznik(MyDate termin, String waluta) throws Exception
   {
      if (!kursy.containsKey(termin))
      {
         if (kursy.size() >= memoryLimit)
            kursy.clear(); //TODO usuwanie połowy na przykład
         kursy.put(termin, new KursDnia(adresKursu.get(termin)));
      }
      return kursy.get(termin).getPrzelicznik(waluta);
   }

   /**
    * Funkcja zwracająca zbiór dostępnych walut
    *
    * @return Kolekcja skrótow dostępnych walut
    */
   public static Collection<String> getSkróty()
   {
      return skrótKraj.keySet();
   }

   public static String getCounty(String skrót)
   {
      return skrótKraj.get(skrót);
   }
   
   public static List<MyDate> getDaty()
   {
      return dostepneDaty;
   }
}
